Для реализации поиска по названию документа и типу документа в NestJS, вы можете использовать параметры запроса (query parameters
). Это позволит передавать параметры name
и type_id
через строку запроса (например, /documents?name=example&type_id=1
).
Обновленный контроллер
Вот как можно обновить ваш контроллер для обработки этих параметров:
typescript
import { Controller, Get, Query, NotFoundException } from '@nestjs/common';
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
import { DocumentsService } from './documents.service';
@Controller('documents')
export class DocumentsController {
constructor(private readonly documentsService: DocumentsService) {}
@ApiOperation({ summary: 'Получить список документов по названию и типу' })
@ApiResponse({ status: 200, description: 'Документы успешно найдены.' })
@ApiResponse({ status: 404, description: 'Документы не найдены.' })
@Get()
async findDocuments(
@Query('name') name: string,
@Query('type_id') typeId: number,
) {
const documents = await this.documentsService.findDocuments(name, typeId);
if (!documents || documents.length === 0) {
throw new NotFoundException('Документы не найдены.');
}
return documents;
}
}
Обновленный сервис
В сервисе DocumentsService
нужно реализовать метод findDocuments
, который будет обрабатывать параметры name
и type_id
:
typescript
import { Injectable } from '@nestjs/common';
@Injectable()
export class DocumentsService {
private documents = [
// Пример данных
{ id: 1, name: 'Document 1', type_id: 1 },
{ id: 2, name: 'Document 2', type_id: 2 },
{ id: 3, name: 'Document 3', type_id: 1 },
];
async findDocuments(name?: string, typeId?: number) {
// Фильтрация документов по названию и типу
return this.documents.filter((doc) => {
const matchesName = name ? doc.name.includes(name) : true;
const matchesType = typeId ? doc.type_id === typeId : true;
return matchesName && matchesType;
});
}
}
Объяснение кода
- Контроллер:
- Используется декоратор
@Query
для получения параметровname
иtype_id
из строки запроса. - Если документы не найдены, выбрасывается исключение
NotFoundException
.
- Используется декоратор
- Сервис:
- Метод
findDocuments
фильтрует массив документов по переданным параметрамname
иtype_id
. - Если параметры не переданы, фильтрация по соответствующему критерию пропускается.
- Метод
Пример запросов
- Поиск по названию документа:javascript
GET /documents?name=Document
- Поиск по типу документа:javascript
GET /documents?type_id=1
- Поиск по названию и типу:javascript
GET /documents?name=Document&type_id=1
- Если параметры не переданы, возвращаются все документы:javascript
GET /documents
Swagger-документация
Если вы используете @nestjs/swagger
, параметры запроса можно задокументировать с помощью декоратора @ApiQuery
:
typescript
import { ApiQuery } from '@nestjs/swagger';
@ApiOperation({ summary: 'Получить список документов по названию и типу' })
@ApiResponse({ status: 200, description: 'Документы успешно найдены.' })
@ApiResponse({ status: 404, description: 'Документы не найдены.' })
@ApiQuery({ name: 'name', required: false, description: 'Название документа' })
@ApiQuery({ name: 'type_id', required: false, description: 'Тип документа' })
@Get()
async findDocuments(
@Query('name') name: string,
@Query('type_id') typeId: number,
) {
const documents = await this.documentsService.findDocuments(name, typeId);
if (!documents || documents.length === 0) {
throw new NotFoundException('Документы не найдены.');
}
return documents;
}
Результат
Теперь ваш API поддерживает поиск документов по названию и типу, а также предоставляет удобную документацию через Swagger. Если у вас есть дополнительные вопросы, дайте знать! 😊